Exit<A, E>
https://effect.website/docs/data-types/exit/
GPT-4.icon
Exit<A, E> は、Effect(副作用のある計算)の結果を表現する型です
Effect の実行結果が「成功したのか」「失敗したのか」を安全に表現・処理するための仕組みです。
💡 基本の理解
Exit<A, E> の2つの状態
Exit.Success<A>: 成功したとき。成功値 A を持つ。
Exit.Failure<E>: 失敗したとき。失敗の理由(Cause (effect))を持つ。
code:ts
// 成功例
const successExit = Exit.succeed(42) // Exit<number, never>
// 失敗例
const failureExit = Exit.failCause(Cause.fail("error")) // Exit<never, string>
Exit.succeed
Effectが正常に終わって値が得られた場合、Exit.succeed(value) を使います。
code:ts
const successExit = Exit.succeed(42)
console.log(successExit)
// => { _tag: "Success", value: 42 }
Exit.failCause
Effectが失敗したときは Exit.failCause(Cause.fail(error)) を使います。
code:ts
const failureExit = Exit.failCause(Cause.fail("Something went wrong"))
console.log(failureExit)
// => { _tag: "Failure", cause: { _tag: "Fail", failure: "Something went wrong" } }
Cause (effect) はただのエラーではなく、以下のような複雑な失敗情報を保持できます:
通常のエラー(Cause.fail)
想定外のバグ(Cause.die)
中断(Cause.interrupt)
上記の合成(Cause.parallel, Cause.sequential)
Exit.match
パターンマッチ
Exit.match を使うことで、成功・失敗の両方を安全にハンドリングできます。
code:ts
const exit = Effect.runSyncExit(Effect.succeed(1))
const message = Exit.match(exit, {
onSuccess: (value) => 成功: ${value},
onFailure: (cause) => 失敗: ${Cause.pretty(cause)}
})
console.log(message)
// => 成功: 1
🔁 Exit と Either の違い
Exit<A, E> は概念的には Either<A, Cause<E>> に似ていますが、Cause により失敗の情報がずっとリッチです。
単なる Left<Error> ではなく、「なぜ失敗したか」を構造的に表現できます。
🔄 Exit は Effect の一種
Exit.succeed(x) は Effect.succeed(x) と同じように使えます。
Exit.failCause(cause) も Effect.failCause(cause) と同じように使えます。
つまり、Exit は 「すでに終わった Effect」(定数)だと思っておくと良いです。